package com.bjc.service.impl;

import com.bjc.config.JedisUtil;
import com.bjc.po.User;
import com.bjc.service.UserService;

import lombok.extern.java.Log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.HashMap;
import java.util.Map;

@Service
public class UserServiceImpl implements UserService {

    private static Logger log = LoggerFactory.getLogger(UserServiceImpl.class);

    @Autowired
    private JedisPool jedisPool;//JedisPool  jedis连接池

    /**
     * Redis有什么命令   jedis有什么方法
     * Redis String类型
     * 需求： 用户输入一个key，
     * 先判断Redis中是否存在该数据，
     * 如果存在，在Redis中进行查询，并返回
     * 如果不存在，在mysql数据库查询，将结果赋给Redis，并返回
     */
    @Override
    public String getString(String key) {
        String val = null;
        //1.得到Jedis对象
        Jedis jedis = jedisPool.getResource();
        //2.判断key是否存在Redis
        if (jedis.exists(key)){
            log.info("查询Redis中的数据");
            val =  jedis.get(key);
        }else {
            val = "bjc的redis学习";
            log.info("查询的是mysql数据"+val);
            jedis.set(key,val);

        }
        //3.关闭连接
        jedis.close();
        return val;
    }


    @Autowired
    private JedisUtil jedisUtil;

    /**
     * TODO String类型演示
     * 测试String类型
     * 需求：用户输入一个redis数据，该key的有效期为28小时
     */
    @Override
    public void expireStr(String key,String value){
        Jedis jedis = jedisUtil.getJedis();
        jedis.set(key,value);//永久有效
        jedis.expire(key,20); //28小时
        log.info(key+"\t设置值："+value+"\t"+20);
        jedisUtil.close(jedis);
    }

    /**
     * TODO Hash类型演示
     * 存一个对象
     * 需求分析：根据用户ID查询用户信息
     *  用户在前端传入一个ID编写，
     *  根据用户ID，查询用户对象信息。
     *  先判断如果Redis中存在，直接返回给用户结果
     *  如果Redis不存在，插叙mysql，并将查询结果存入Redis中
     */
    @Override
    public User selectById(String id){
        String key = "user:"+id;
        Jedis jedis = jedisPool.getResource();
        User user = new User();
        if(jedis.exists(key)){ //存在
            log.info("-------------------->查询的是Redis的数据");
            Map<String, String> map = jedis.hgetAll(key);
            user.setId(map.get("id"));
            user.setName(map.get("name"));
            user.setAge(Integer.parseInt(map.get("age")));
        }else { //不存在
            user.setId(id);
            user.setName("卜京城");
            user.setAge(23);
            log.info("-------------------->查询的是MySQL的数据");
            //存入Redis
            Map<String,String> map = new HashMap<>();
            map.put("id",user.getId());
            map.put("name",user.getName());
            map.put("age",user.getAge()+"");
            jedis.hset(key,map);
            log.info("-------------------->向Redis中存储数据");
        }
        //关闭Redis连接
        jedisUtil.close(jedis);
        return user;
    }

}
